// ----------------------------------
// RSDK Project: Sonic Essence
// Script Description: Main Menu
// Script Author: Tails_LP, Xanman
// ----------------------------------

//-------Aliases-------//

private alias object.value0 : menu.xpos
private alias object.value1 : menu.selection
private alias object.value2 : start.fadeValue
private alias object.value3 : menu.direction
private alias object.value4 : creditsoffset
private alias object.value5 : timer
private alias object.value6 : arrowoffset

private alias object.value30 : menu.CheatPos


private alias 0 : ADVENTURE_MODE
private alias 1 : TIME ATTACK
private alias 2 : EXPERT_MODE
private alias 3 : OPTIONS
private alias 4 : CONTROLS
private alias 5 : GALLERY
private alias 6 : SOUND_TEST
private alias 7 : CREDITS
private alias 8 : FEEDBACK
private alias 9 : EXIT

private alias 0 : INACTIVE
private alias 1 : SCROLL_IN
private alias 2 : MENU_IDLE

private alias 3 : LOAD_OPTIONS
private alias 4 : LOAD_CREDITS
private alias 5 : LOAD_CONTROLS

private alias 6 : SCROLL_OUT
private alias 7 : EXITING
private alias 8 : INACTIVE_CONTROLS

private alias 9 : LOAD_FEEDBACK

//-------Static Values-------//
private value fullscreen = 0;
private value scale = 0;
private value vsync = 0;
private value filter = 0;

//-------Tables-------//


//-------Functions-------//
function Menu_CheckButtonCheat
	temp5 = 0
	if inputPress.up == 1
		temp5 = 1
	end if
	if inputPress.down == 1
		temp5 = 2
	end if
	if inputPress.left == 1
		temp5 = 3
	end if
	if inputPress.right == 1
		temp5 = 4
	end if
	if inputPress.buttonA == 1
		temp5 = 5
	end if
	if inputPress.buttonB == 1
		temp5 = 6
	end if
	if inputPress.buttonC == 1
		temp5 = 7
	end if
	switch menu.CheatPos
	case 0
		if temp5 == 1
			menu.CheatPos++
		else
			if temp5 != 0
				menu.CheatPos = 0
			end if
		end if
		break
	case 1
		if temp5 == 1
			menu.CheatPos++
		else
			if temp5 != 0
				menu.CheatPos = 0
			end if
		end if
		break
	case 2
		if temp5 == 1
			menu.CheatPos++
		else
			if temp5 != 0
				menu.CheatPos = 0
			end if
		end if
		break
	case 3
		if temp5 == 2
			menu.CheatPos++
		else
			if temp5 != 0
				menu.CheatPos = 0
			end if
		end if
		break
	case 4
		if temp5 == 2
			menu.CheatPos++
		else
			if temp5 != 0
				menu.CheatPos = 0
			end if
		end if
		break
	case 5
		if temp5 == 2
			menu.CheatPos++
		else
			if temp5 != 0
				menu.CheatPos = 0
			end if
		end if
		break
	case 6
		if temp5 == 3
			menu.CheatPos++
		else
			if temp5 != 0
				menu.CheatPos = 0
			end if
		end if
		break
	case 7
		if temp5 == 4
			menu.CheatPos++
		else
			if temp5 != 0
				menu.CheatPos = 0
			end if
		end if
		break
	case 8
		if temp5 == 3
			menu.CheatPos++
		else
			if temp5 != 0
				menu.CheatPos = 0
			end if
		end if
		break
	case 9
		if temp5 == 4
			menu.CheatPos++
			menu.CheatPos = 0
			options.stageSelectFlag ^= 1
			PlaySfx(SfxName[Ring L], 0)
		else
			if temp5 != 0
				menu.CheatPos = 0
			end if
		end if
		break
	end switch
end function

function Menu_Point_Select
	switch menu.selection
	case ADVENTURE_MODE
		object.state = EXITING
		SetScreenFade(0, 0, 0, start.fadeValue)
		start.fadeValue += 8
		music.volume -= 5
		if start.fadeValue >= 312
			player.score = 0
			if options.stageSelectFlag == 1
				stage.activeList = BONUS_STAGE
				options.gameMode = 1
			else
				stage.activeList = REGULAR_STAGE
				options.gamemode = 0
			endif
			stage.listPos = 0
			options.expertmode = 0
			LoadStage()
			options.stageSelectFlag = 0
		endif
		break
	case TIME ATTACK
		object.state = EXITING
		SetScreenFade(0, 0, 0, start.fadeValue)
		start.fadeValue += 8
		music.volume -= 5
		if start.fadeValue >= 312
			player.score = 0
			stage.activeList = PRESENTATION_STAGE
			stage.listPos = 1
			options.expertmode = 0
			LoadStage()
			options.stageSelectFlag = 0
		endif
		break
	case EXPERT_MODE
		if SaveRAM[408] == 1
			object.state = EXITING
			SetScreenFade(0, 0, 0, start.fadeValue)
			start.fadeValue += 8
			music.volume -= 5
			if start.fadeValue >= 312
				options.gamemode = 0
				player.score = 0
				stage.activeList = BONUS_STAGE
				stage.listPos = 2
				options.expertmode = 0
				LoadStage()
				options.stageSelectFlag = 0
			end if
		end if
		break
	case OPTIONS
		object.state = LOAD_OPTIONS
		break
	case CONTROLS
		object.state = LOAD_CONTROLS
		break
	case GALLERY
		break
	case SOUND_TEST
		//object.state = EXITING
		//creditsoffset ++
		//SetScreenFade(0, 0, 0, start.fadeValue)
		//if creditsoffset >= 200
			//start.fadeValue += 8
		//end if
		//music.volume -= 8
		//if start.fadeValue >= 312
			//player.score = 0
			//stage.activeList = PRESENTATION_STAGE
			//stage.listPos = 3
			//LoadStage()
		//endif
		break
	case CREDITS
		object.state = LOAD_CREDITS
		break
	case FEEDBACK
		object.state = LOAD_FEEDBACK
		break
	case EXIT
		SaveRAM[409] = 0
		WriteSaveRAM()
		object.state = EXITING
		SetScreenFade(0, 0, 0, start.fadeValue)
		start.fadeValue += 6
		music.volume -= 5
		if start.fadeValue >= 312
			CallNativeFunction(12)	//kills the engine
		endif
		break
	endswitch
endfunction

event ObjectMain
	object.inkEffect = INK_ALPHA
	switch object.state
	case INACTIVE
		temp3 = 0
		menu.xpos = 8
		break
	case SCROLL_IN
		object.alpha = 255
		if menu.xpos > -160
			menu.xpos -= 12
		else
			menu.xpos = -160
			object.state = MENU_IDLE
			temp4 = 0
		endif
		break
	case MENU_IDLE
		temp5 = 0
		if object.alpha <= 255
			object.alpha += 10
		end if
		if inputPress.down == 1
			if menu.selection < 9
				menu.selection ++
			else
				menu.selection = 0
			endif
			PlaySfx(SfxName[Menu Move], 0)
		endif
		if inputPress.up == 1	
			if menu.selection > 0
				menu.selection --
			else
				menu.selection = 9
			endif
			PlaySfx(SfxName[Menu Move], 0)
		endif

		if inputPress.start == 1
			temp3 = 1
		endif
		if inputPress.ButtonA == 1
			temp3 = 1
		endif
		if temp3 == 1
			callFunction(Menu_Point_Select)

			switch menu.selection
			case ADVENTURE_MODE
				PlaySfx(SfxName[Adventure Select], 0)
				break
			case TIME ATTACK
				PlaySfx(SfxName[Menu Select], 0)
				break
			case EXPERT_MODE
				if SaveRAM[408] == 1
					PlaySfx(SfxName[Adventure Select], 0)
				else
					PlaySfx(SfxName[Red Ring], 0)	
					//PlaySfx(SfxName[Locked], 0)
				end if
				break
			case OPTIONS
				PlaySfx(SfxName[Menu Select], 0)
				break
			case CONTROLS
				PlaySfx(SfxName[Menu Select], 0)
				break
			case GALLERY
				PlaySfx(SfxName[Locked], 0)
				break
			case SOUND_TEST
				PlaySfx(SfxName[Locked], 0)
				//PlaySfx(SfxName[Sound Test], 0)
				break
			case CREDITS
				PlaySfx(SfxName[Menu Select], 0)
				break
			case FEEDBACK
				PlaySfx(SfxName[Menu Select], 0)
				break
			case EXIT
				PlaySfx(SfxName[Menu Select], 0)
				break
			endswitch
			temp3 = 0
		endif
		callFunction(menu_CheckButtonCheat)

		if inputPress.buttonB == 1
			temp4 = 1
		end if
		if temp4 == 1
			PlaySfx(SfxName[Menu Back], 0)
			object.state = SCROLL_OUT
			foreach (TypeName[Ground], arrayPos3, ALL_ENTITIES)
				object[arrayPos3].state = 3
			next
			foreach (TypeName[Initial Background], arrayPos0, ALL_ENTITIES)
				object[arraypos0].state = 1
			next
			title.state = 0
		endif
		break
	case LOAD_OPTIONS
		if menu.xpos < 8
			menu.xpos += 12
		else
			menu.xpos = 8
			object.state = INACTIVE
			foreach (TypeName[Options Menu], arrayPos0, ALL_ENTITIES)
				object[arrayPos0].state = 1
			next
		endif
		break
	case LOAD_CREDITS
		if menu.xpos < 8
			menu.xpos += 12
		else
			menu.xpos = 8
			object.state = INACTIVE
			foreach (TypeName[Credits Menu], arrayPos0, ALL_ENTITIES)
				object[arrayPos0].state = 1
			next
		endif
		break
	case LOAD_CONTROLS
		if menu.xpos < 8
			menu.xpos += 12
		else
			menu.xpos = 8
			object.state = INACTIVE_CONTROLS
			foreach (TypeName[Controls Menu], arrayPos0, ALL_ENTITIES)
				object[arrayPos0].state = 1
			next
		endif
		break
	case SCROLL_OUT
		if menu.xpos < 8
			menu.xpos += 12
		else
			menu.xpos = 8
			object.state = INACTIVE
			foreach (TypeName[Start Message], arrayPos0, ALL_ENTITIES)
				object[arrayPos0].state = 0
			next
		endif
		break
	case EXITING
		callFunction(Menu_Point_Select)
		break
	case INACTIVE_CONTROLS
		menu.xpos = 8
		break
	case LOAD_FEEDBACK
		if menu.xpos < 8
			menu.xpos += 12
		else
			menu.xpos = 8
			object.state = INACTIVE
			foreach (TypeName[Feedback Prompt], arrayPos0, ALL_ENTITIES)
				object[arrayPos0].state = 1
			next
		endif
		break
	endswitch
end event

event ObjectDraw
	arrowoffset++
	temp0 = screen.xsize
	temp0 += menu.xpos
	DrawRect(temp0, 0, 160, screen.ysize, 0, 0, 0, 255)

	temp0 -= 4
	temp1-= arrowoffset
	while temp1 < screen.ysize
		DrawSpriteScreenXY(0, temp0, temp1)
		temp1 += 64
		DrawSpriteScreenXY(0, temp0, temp1)
		temp1 += 64
	loop
		temp0 = screen.xsize
		temp0 += menu.xpos
		temp0 += 32
		temp1 = 54
		if options.stageSelectFlag == 0
			DrawSpriteScreenFX(1, FX_INK, temp0, temp1)
		else
			DrawSpriteScreenFX(12, FX_INK, temp0, temp1)
		endif
		temp1 += 16
		DrawSpriteScreenFX(2, FX_INK, temp0, temp1)
		temp1 += 16
		if SaveRAM[408] == 1
			DrawSpriteScreenFX(11, FX_INK, temp0, temp1)
		else
			DrawSpriteScreenFX(9, FX_INK, temp0, temp1)
		end if
		temp1 += 16
		DrawSpriteScreenFX(4, FX_INK, temp0, temp1)
		temp1 += 16
		DrawSpriteScreenFX(10, FX_INK, temp0, temp1)
		temp1 += 16
		DrawSpriteScreenFX(8, FX_INK, temp0, temp1)
		temp1 += 16
		DrawSpriteScreenFX(7, FX_INK, temp0, temp1)
		temp1 += 16
		DrawSpriteScreenFX(3, FX_INK, temp0, temp1)
		temp1 += 16
		DrawSpriteScreenFX(13, FX_INK, temp0, temp1)
		temp1 += 16
		DrawSpriteScreenFX(5, FX_INK, temp0, temp1)

		temp1 = menu.selection
		temp1 *= 16
		temp1 += 54
		DrawSpriteScreenFX(6, FX_INK, temp0, temp1)
	end if
end event

event ObjectStartup
	CallNativeFunction(GetWindowScale)
	scale = checkResult
	CallNativeFunction(GetWindowFullScreen)
	fullscreen = checkResult
	CallNativeFunction(GetWindowVSync)
	vsync = checkResult
	CallNativeFunction(GetWindowScaleMode)
	filter = checkResult

	object[3].type = TypeName[Main Menu]
    	LoadSpriteSheet("Title/Title2.gif")
	SpriteFrame(-4, 0, 8, 128, 219, 1)		//00 Black Banner

	SpriteFrame(0, -3, 94, 7, 1, 156)		//01 Adventure Mode
	SpriteFrame(0, -3, 68, 7, 1, 370)		//02 Time Attack
	SpriteFrame(0, -3, 43, 7, 1, 378)		//03 Credits
	SpriteFrame(0, -3, 42, 8, 1, 181)		//04 Options
	SpriteFrame(0, -3, 22, 7, 1, 190)		//05 Quit

	SpriteFrame(-10, -3, 4, 7, 91, 164)		//06 Arrow

	SpriteFrame(0, -3, 65, 7, 294, 281)		//07 Sound Test
	SpriteFrame(0, -3, 39, 8, 1, 164)		//08 Gallery
	SpriteFrame(0, -3, 20, 8, 1, 395)		//09 ???
	SpriteFrame(0, -3, 50, 8, 294, 391)		//10 Controls
	SpriteFrame(0, -3, 100, 8, 294, 417)		//11 Expert
	SpriteFrame(0, -3, 45, 8, 294, 441)		//12 3D Test

	SpriteFrame(0, -3, 54, 7, 1, 404)		//13 Feedback
end event

event RSDKDraw
	DrawSprite(0)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-16, -16, 32, 32, 223, 172)
end event